home *** CD-ROM | disk | FTP | other *** search
/ Workbench Design / WB Collection.iso / workbench werkzeuge / memory & system tools / copymemquicker / source / cm000.asm next >
Assembly Source File  |  1996-04-07  |  2KB  |  138 lines

  1.     xdef    Start00
  2.     xdef    Quicker00
  3.     xdef    Quickest00
  4.     xdef    CopyLen00
  5. Quicker00    equ    Quicker-Start00
  6. Quickest00    equ    Quickest-Start00
  7. CopyLen00    equ    Stop00-Start00
  8.  
  9. Start00
  10.     dc.l    '*Art'
  11. Quicker
  12.     moveq    #12,d1
  13.     cmp.l    d1,d0
  14.     bcs.s    tinycpy        ; too small to gain anything
  15.     move.w    a0,d1
  16.     lsr.b    #1,d1        ; fastest test for evenness
  17.     bcc.s    evena0
  18.     move.b    (a0)+,(a1)+
  19.     subq.l    #1,d0
  20. evena0    move.w    a1,d1
  21.     lsr.b    #1,d1
  22.     bcc.s    evenquicker
  23.  
  24.     moveq    #36*3,d1
  25.     cmp.l    d1,d0
  26.     bcs.s    tinycpy
  27.  
  28. * This is tricky!  They said it couldn't be done...
  29. unevcpy    movem.l    a2-a4/d2-d7,-(sp)
  30.     moveq    #32,d1        ; 8 registers of 4 bytes
  31.     move.w    d1,a3
  32.     moveq    #34,d1        ; as above plus 2 "roundoff" bytes
  33.     move.w    d1,a4
  34.     sub.l    d1,d0
  35.     move.l    d0,a2
  36. uloop    movem.l    (a0)+,d0-d7
  37.     rol.l    #8,d0
  38.     rol.l    #8,d1
  39.     rol.l    #8,d2
  40.     rol.l    #8,d3
  41.     rol.l    #8,d4
  42.     rol.l    #8,d5
  43.     rol.l    #8,d6
  44.     rol.l    #8,d7
  45.     move.b    d0,(a1)+
  46.     move.b    d1,d0
  47.     move.b    d2,d1
  48.     move.b    d3,d2
  49.     move.b    d4,d3
  50.     move.b    d5,d4
  51.     move.b    d6,d5
  52.     move.b    d7,d6
  53.     move.b    (a0)+,d7
  54.     movem.l    d0-d7,(a1)
  55.     adda.w    a3,a1
  56.     move.b    (a0)+,(a1)+
  57.     suba.w    a4,a2
  58.     move.l    a2,d0
  59.     bpl.s    uloop
  60.     add.w    a4,d0
  61.     movem.l    (sp)+,a2-a4/d2-d7
  62.     subq.b    #1,d0
  63.     bcs.s    tdone
  64.  
  65. tloop    move.b    (a0)+,(a1)+
  66. tinycpy    dbf    d0,tloop
  67. tdone    rts
  68.  
  69. evenquicker
  70.     moveq    #44*2,d1
  71.     cmp.l    d1,d0
  72.     bcs.s    smlmov
  73.     moveq    #44,d1        ; 11 registers of 4 bytes
  74.     sub.l    d1,d0
  75.     movem.l    d2-d7/a2-a6,-(sp)
  76. bigmov    movem.l    (a0)+,d2-d7/a2-a6
  77.     movem.l    d2-d7/a2-a6,(a1)
  78.     adda.w    d1,a1
  79.     sub.l    d1,d0
  80.     bcc.s    bigmov
  81.     add.w    d1,d0
  82.     movem.l    (sp)+,d2-d7/a2-a6
  83.  
  84. smlmov    lsr.w    #1,d0
  85.     beq.s    even01
  86.     bcs.s    sm13
  87.     lsr.w    #1,d0
  88.     beq.s    even2
  89.     bcs.s    sm2
  90. sm0    subq.w    #1,d0
  91. loop0    move.l    (a0)+,(a1)+
  92.     dbf    d0,loop0
  93. even0    rts
  94. sm2    subq.w    #1,d0
  95. loop2    move.l    (a0)+,(a1)+
  96.     dbf    d0,loop2
  97. even2    move.w    (a0),(a1)
  98.     rts
  99. sm13    lsr.w    #1,d0
  100.     beq.s    even3
  101.     bcs.s    sm3
  102. sm1    subq.w    #1,d0
  103. loop1    move.l    (a0)+,(a1)+
  104.     dbf    d0,loop1
  105. even1    move.b    (a0),(a1)
  106.     rts
  107. sm3    subq.w    #1,d0
  108. loop3    move.l    (a0)+,(a1)+
  109.     dbf    d0,loop3
  110. even3    move.w    (a0)+,(a1)+
  111.     move.b    (a0),(a1)
  112.     rts
  113. even01    bcs.s    even1
  114.     rts
  115.  
  116.     dc.l    '*Art'
  117. Quickest
  118.     moveq    #44*2,d1
  119.     cmp.l    d1,d0
  120.     bcs.s    smlmovQ
  121.     moveq    #44,d1        ; 11 registers of 4 bytes
  122.     sub.l    d1,d0
  123.     movem.l    d2-d7/a2-a6,-(sp)
  124. bigmovQ    movem.l    (a0)+,d2-d7/a2-a6
  125.     movem.l    d2-d7/a2-a6,(a1)
  126.     adda.w    d1,a1
  127.     sub.l    d1,d0
  128.     bcc.s    bigmovQ
  129.     add.w    d1,d0
  130.     movem.l    (sp)+,d2-d7/a2-a6
  131. smlmovQ    lsr.w    #2,d0
  132.     beq.s    done
  133.     subq.w    #1,d0
  134. qloop    move.l    (a0)+,(a1)+
  135.     dbf    d0,qloop
  136. done    rts
  137. Stop00
  138.